# -*- coding: utf-8 -*-
"""
------------------------------------------------------------------------------
    File Name:  pandas_demo
    Author   :  wanwei1029
    Date     :  2018-10-16
    Desc     :  1 python 默认参数创建线程后，不管主线程是否执行完毕，都会等待子线程执行完毕才一起退出，有无join结果一样
                2 如果创建线程，并且设置了daemon为true，即thread.setDaemon(True), 则主线程执行完毕后自动退出，
                    不会等待子线程的执行结果。而且随着主线程退出，子线程也消亡。
                3 join方法的作用是阻塞，等待子线程结束，join方法有一个参数是timeout，即如果主线程等待timeout，
                    子线程还没有结束，则主线程强制结束子线程。
                4 如果线程daemon属性为False， 则join里的timeout参数无效。主线程会一直等待子线程结束。
                5 如果线程daemon属性为True， 则join里的timeout参数是有效的， 主线程会等待timeout时间后，结束子线程。此处有一个坑，
                    即如果同时有N个子线程join(timeout），那么实际上主线程会等待的超时时间最长为 N ＊ timeout，
                    因为每个子线程的超时开始时刻是上一个子线程超时结束的时刻。
                join():如果一个线程在执行过程中要调用另外一个线程，并且等到其完成以后才能接着执行，
                        那么在调用这个线程时可以使用被调用线程的join方法.
                如下代码，在所以子线程执行完毕后，再执行特定方法：
                main_thread = threading.current_thread()
                for t in threading.enumerate():
                    if t is not main_thread:
                        t.join()
                do others..
------------------------------------------------------------------------------
"""
import threading
import time


class ThreadDemo(threading.Thread):
    def __init__(self, threadId, name, counter):
        threading.Thread.__init__(self)
        self.thredId = threadId
        self.name = name
        self.counter = counter

    def run(self):
        print(" start thread : " + self.name)
        print_time(self.name, 1, self.counter)
        print(" end thread : " + self.name)


def print_time(thread_name, delay, counter):
    while counter:
        time.sleep(delay)
        print("%s -- %s " % (thread_name, time.ctime(time.time())))
        counter -= 1


thread1 = ThreadDemo(1, "thread1", 5)
thread2 = ThreadDemo(2, "thread2", 3)

thread1.start()
thread2.start()
thread1.join()
thread2.join()

print(" all threads done ! ")
